# -*- encoding:utf-8 -*-
# @Time : 2020/12/25
# @Author : Xuejm
"""
通过Python编程完成一个银行ATM机模拟系统，具备如下功能:
(1)登陆验证：用户输入用户名密码登陆，检测用户名是否存在以及用户名密码是否匹配；用户名密码共有三次输入机会，超过三次系统退出。
(2)菜单界面：登陆成功后显示功能操作界面，输入序号选择对应功能。
(3)用户注册：用户可以输入用户名和密码创建自己的账号，并输入电话号码等信息，如果用户名存在则让用户重新输入用户名。注册后免费赠送5000元余额。
(4)账户管理：用户可以随时查看自己的账户余额。用户可以输入其他账户用户名，实现转账功能；转账时用户名必须存在，否则提示异常。用户也可以模拟实现存取款功能。
(5)用户名和密码以及账户信息等必须永久保存。且基于命令行完成，不需要开发GUI界面。
"""

import time
import json
import datetime

class CustomerData:

    def start(self):

        print('ATM初始化成功')
        print('欢迎使用ATM自助柜员机系统')

        while True:
            print('(1) 用户登录')
            print('(2) 用户注册')
            print('(0) 直接退出 ')
            i = input('请按1进入操作，按0退出:')
            if i == '1':
                self.login()
            elif i == '2':
                self.data_register()
            elif i == '0':
                break
            if i not in '012':
                print('无效的输入，请重新输入')

    def login(self):
        self.file_open()

        count = 0
        while True:
            name = input('请输入用户名：')
            if name in data:
                while True:
                    password = input('请输入密码：')
                    if password == data[name][0]:
                        print('登录成功')
                        self.maininterface(name)
                    elif count < 3:
                        print('密码错误，请重新输入')
                        count += 1
                    else:
                        print('-'*30)
                        print('对不起，您的错误次数超限 ')
                        print('-' * 30)
                        self.start()

            elif name not in data:

                if count < 2:
                    print('-' * 30)
                    print('对不起，用户名不存在，请重新输入(连续三次输入错误将自动退出)')

                    count += 1

                    continue
                if count >= 2:
                    print('对不起，输入次数超限')
                    self.start()

    def maininterface(self, name):
        while True:
            now = str(datetime.datetime.now())[:-7]
            print(f'{name} 先生/女士 您好\n{now}')
            print('1、查询余额\n2、转账\n3、存款\n4、取款\n5、退出')
            user_input = input('请输入按键：')
            if user_input not in {'1', '2', '3','4','5'}:
                print('输入错误，请重新输入')
            elif int(user_input) == 1:
                self.inquiry(name)
                #break
            elif int(user_input) == 2:
                self.transfer(name)
                #break
            elif int(user_input) == 3:
                self.save(name)
                #reak
            elif int(user_input) == 4:
                self.withdraw(name)
                #break
            else:
                self.start()

    def data_register(self):
        balance = 0
        while True:
            name = input('请输入用户名：')
            if name in data:
                print('账户已存在，请重新输入')
                continue
            else:
                password = input('请输入密码：')
                phone = input('请输入手机号码：')
                new_data = {name: [password, phone, balance]}
                print('-' * 30)
                print('您的注册信息为:')
                print(f'注册姓名为: {name},您的注册密码为:{password}, 您的注册电话号码为: {phone}')
                print('-' * 30)
                confirm = input('确认请按 1; 取消请按 2: ')

                if confirm == '1':
                    print('-' * 30)
                    print('恭喜您，您已经注册成功，您的账户获得5000注册奖励')
                    print('-' * 30)

                    with open('customerdata.txt', 'w') as f:
                        data.update(new_data)
                        json.dump(data, f)
                        f.close()
                        break
                elif confirm == '2':
                    self.start()

    def inquiry(self, name):
        print('-' * 30)
        print(f'您的余额为5000元')
        print('-' * 30)
        self.maininterface(name)

    def transfer(self, name):
        print('-' * 30)
        while True:
            target_name = input('请输入对方姓名:')
            if target_name in data:
                transfer_data = input('请输入转账金额:')
                if int(transfer_data) > data[name][2]:
                    print('余额不足，请重新输入')
                else:
                    data[target_name][2] += int(transfer_data)
                    data[name][2] -= int(transfer_data)
                    print(f'您的余额为{data[name][2]}元')
                    with open('customerdata.txt', 'r+') as f:
                        json.dump(data, f)
                        f.close()
                        self.maininterface(name)
                    break
            if target_name not in data:
                print('对不起，您输入的姓名不存在，请重新输入')
                continue

    def save(self, name):
        print('-' * 30)
        while True:
            save_count = input('请输入存入金额:')
            if int(save_count) < 0:
                print('金额输入错误，请重新输入')
                continue
            else:
                data[name][2] += int(save_count)
                print(f'您的余额为{data[name][2]}元')
                with open('customerdata.txt', 'r+') as f:
                    json.dump(data, f)
                    f.close()
                    self.maininterface(name)

    def withdraw(self, name):
        print('-' * 30)
        while True:
            draw_count = input('请输入取款金额:')
            if int(draw_count) < 0:
                print('金额输入错误，请重新输入')
                continue
            elif int(draw_count) > data[name][2]:
                print('输入金额过大，请重新输入')
            else:
                data[name][2] -= int(draw_count)
                print(f'您的余额为{data[name][2]}元')
                with open('customerdata.txt', 'r+') as f:
                    json.dump(data, f)
                    f.close()
                    self.maininterface(name)

    def file_open(self):
        with open('customerdata.txt', 'r') as f:
            # 这个data用上了吗？
            data = json.load(f)
            f.close()

    def file_save(self):
        with open('customerdata.txt', 'w+') as f:
            json.dump(data, f)
            f.close()

    def exit(self):
        print('-' * 30)
        print('退出系统')
        self.start()

with open('customerdata.txt', 'r') as f:
    data = json.load(f)
    f.close()
CustomerData().start()
